﻿<?PHP
/**
 * 上传图片
 */
class imgUpload {
	protected static $a;
	protected $formName; // 表单名称
	protected $directory; // 文件上传至目录
	protected $maxSize; // 最大文件上传大小
	protected $canUpload; // 是否可以上传
	protected $doUpFile; // 上传的文件名
	protected $sm_File; // 缩略图名称
	protected $sm_File2; // 缩略图名称
	protected $max_len; // 缩略图最大尺寸
	function __construct($_formName = 'file', $_directory = './', $_maxSize = 1048576, $max_len_s = null) { // 1024*1024=1M
	                                                                                                        // 初始化参数
		$this->formName = $_formName;
		$this->directory = $_directory;
		$this->maxSize = $_maxSize;
		$this->canUpload = true;
		$this->doUpFile = '';
		$this->sm_File = '';
		$this->sm_File2 = '';
		$this->max_len = $max_len_s != null ? $max_len_s : 620;
	}
	
	// 判断图片是否属于允许格式内
	static public function Type($_formName = 'file') {
		$_type = $_FILES [$_formName] ['type'];
		switch ($_type) {
			case 'image/gif' :
				if (self::$a == NULL)
					self::$a = new imgUpload ( $_formName );
				break;
			case 'image/pjpeg' :
				if (self::$a == NULL)
					self::$a = new imgUpload ( $_formName );
				break;
				
			case 'application/octet-stream' :
				if (self::$a == NULL)
					self::$a = new imgUpload ( $_formName );
				break;
			case 'image/x-png' :
				if (self::$a == NULL)
					self::$a = new imgUpload ( $_formName );
				break;
			default :
				self::$a = false;
		}
		return self::$a;
	}
	
	// 获取文件大小
	public function getSize($_format = 'K') {
		if ($this->canUpload) {
			if (0 == $_FILES [$this->formName] ['size']) {
				$this->canUpload = false;
				return $this->canUpload;
				break;
			}
			switch ($_format) {
				case 'B' :
					return $_FILES [$this->formName] ['size'];
					break;
				case 'K' :
					return round ( $_FILES [$this->formName] ['size'] / 1024 );
					break;
				case 'M' :
					return round ( $_FILES [$this->formName] ['size'] / (1024 * 1024), 2 );
					break;
			}
		}
	}
	
	// 获取文件类型
	public function getExt() {
		if ($this->canUpload) {
			$_name = $_FILES [$this->formName] ['name'];
			$_nameArr = explode ( '.', $_name );
			if(count($_nameArr)<=1){
				return "jpeg";
			}else{
				$_count = count ( $_nameArr ) - 1;
			}
			
		}
		return $_nameArr [$_count];
	}
	
	// 获取文件名称
	public function getName() {
		if ($this->canUpload) {
			return $_FILES [$this->formName] ['name'];
		}
	}
	
	// 新建文件名
	public function newName() {
		return date ( 'YmdHis' ) . rand ( 0, 9 );
	}
	
	// 上传文件
	public function upload() {
		if ($this->canUpload) {
			$_getSize = $this->getSize ( 'B' );
			if (! $_getSize) {
				return $_getSize;
				break;
			} else {
				$_newName = $this->newName ();
				$_ext = $this->getExt ();
				$_doUpload = move_uploaded_file ( $_FILES [$this->formName] ['tmp_name'], $this->directory . $_newName . "." . $_ext );
				if ($_doUpload) {
					$this->doUpFile = $_newName;
				}
				return $_doUpload;
			}
		}
	}
	
	// 创建缩略图
	public function thumb($_dstChar = '_m', $_max_len = null) { // $_dstChar:_m , _s
		if ($this->canUpload && $this->doUpFile != "") {
			$_ext = $this->getExt ();
			$_srcImage = $this->directory . $this->doUpFile . "." . $_ext;
			$_max_len = $this->max_len;
			// 得到图片信息数组
			$_date = getimagesize ( $_srcImage, &$info );
			
			$src_w = $_date [0]; // 源图片宽
			$src_h = $_date [1]; // 源图片高
			$src_max_len = max ( $src_w, $src_h ); // 求得长边
			$src_min_len = min ( $src_w, $src_h ); // 求得短边
			$dst_w = ''; // 目标图片宽
			$dst_h = ''; // 目标图片高
			             
			// 宽高按比例缩放，最长边不大于$_max_len
			if ($src_max_len > $_max_len) {
				$percent = $src_min_len / $src_max_len;
				if ($src_w == $src_max_len) {
					$dst_w = $_max_len;
					$dst_h = $percent * $dst_w;
				} else {
					$dst_h = $_max_len;
					$dst_w = $percent * $dst_h;
				}
			} else {
				$dst_w = $src_w;
				$dst_h = $src_h;
			}
			
			// 建立缩略图时,源图片的位置
			$src_x = 0;
			$src_y = 0;
			
			// 判断如果缩略图用于logo，将对其进行裁减
			if ('s_' == $_dstChar) {
				$src_x = $src_w * 0.10;
				$src_y = $src_h * 0.10;
				$src_w *= 0.8;
				$src_h *= 0.8;
			}
			
			// 判断图片类型并创建对应新图片
			switch ($_date [2]) {
				case 1 :
					$src_im = imagecreatefromgif ( $_srcImage );
					break;
				case 2 :
					$src_im = imagecreatefromjpeg ( $_srcImage );
					break;
				case 3 :
					$src_im = imagecreatefrompng ( $_srcImage );
					break;
				case 8 :
					$src_im = imagecreatefromwbmp ( $_srcImage );
					break;
			}
			
			// 创建一幅新图像
			if ($_date [2] == 1) { // gif无法应用imagecreatetruecolor
				$dst_im = imagecreate ( $dst_w, $dst_h );
			} else {
				$dst_im = imagecreatetruecolor ( $dst_w, $dst_h );
			}
			
			// 对这副图像进行缩略图copy
			// $bg = imagecolorallocate($dst_im,255,255,0);
			imagecopyresized ( $dst_im, $src_im, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );
			// 对图片进行抗锯齿操作
			imageantialias ( $dst_im, true );
			
			switch ($_date [2]) {
				case 1 :
					$cr = imagegif ( $dst_im, $this->directory . $this->doUpFile . $_dstChar . "." . $_ext, 100 );
					break;
				case 2 :
					$cr = imagejpeg ( $dst_im, $this->directory . $this->doUpFile . $_dstChar . "." . $_ext, 100 );
					break;
				case 3 : // imagepng有问题，所以在这里用imagejpg代替
					$cr = imagejpeg ( $dst_im, $this->directory . $this->doUpFile . $_dstChar . "." . $_ext, 100 );
					break;
			}
			// $cr = imagejpeg($dst_im, $this->directory.$_dstChar.$this->doUpFile, 90);
			if ($cr) {
				$this->sm_File = $this->directory . $this->doUpFile . $_dstChar . "." . $_ext;
				$this->sm_File2 = $this->doUpFile . $_dstChar . "." . $_ext;
				
				return $this->sm_File;
			} else {
				return false;
			}
		}
		imagedestroy ( $dst_im );
		imagedestroy ( $cr );
	}
	
	// 得到上传后的文件名
	public function getUpFile() {
		if ($this->doUpFile != '') {
			$_ext = $this->getExt ();
			return $this->doUpFile . "." . $_ext;
		} else {
			return false;
		}
	}
	
	// 得到上传后的文件全路径
	public function getFilePatch() {
		if ($this->doUpFile != '') {
			$_ext = $this->getExt ();
			return $this->directory . $this->doUpFile . "." . $_ext;
		} else {
			return false;
		}
	}
	
	// 得到缩略图文件全路径
	public function getThumb() {
		if ($this->sm_File != '') {
			return $this->sm_File;
		} else {
			return false;
		}
	}
	
	// 得到缩略图文件全路径
	public function getThumb2() {
		if ($this->sm_File2 != '') {
			return $this->sm_File2;
		} else {
			return false;
		}
	}
	
	// 得到上传文件的路径
	public function getDirectory() {
		if ($this->directory != '') {
			return $this->directory;
		} else {
			return false;
		}
	}
}
?>